package com.web.webtitle.service;

import com.web.webtitle.dao.HBaseDao;
import com.web.webtitle.entity.TitleHot;
import com.web.webtitle.vo.TitleHotCount;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class TitleHotService {

    @Autowired
    private HBaseDao hBaseDao;

    /**
     *
     * 通过时间段去查询数据
     * @param startTime 起始
     * @param endTime   结束
     * @return
     * @throws IOException
     */
    public List<TitleHot> findByTimeStamp(long startTime, long endTime) throws IOException {
        return hBaseDao.query(startTime,endTime);
    }

    /**\
     * 带区分终端的热点分布
     * @param agent
     * @param startTime
     * @param endTime
     * @return
     * @throws IOException
     */
    public List<TitleHotCount> countByAgentAndTimeStamp(String agent,long startTime, long endTime) throws IOException {
        //查询出的原始数据
        List<TitleHot> list = hBaseDao.query(startTime, endTime);
        //判断agent的值，如果没有,表示不区分
        List<TitleHot> list1=list.stream()
                .filter(hot -> hot.getAgentType().equals(agent)||"".equals(agent))
                .collect(Collectors.toList());

        Map<String,Integer> map=new HashMap<>();//标题，次数
        for (TitleHot hot : list1) {//标题出现一次  次数就+1
            //map中的key是唯一的，value不唯一
            //判断map中的key(标题)是否存在,若存在就把上一次的值+1;若不存在，则将值设置为1
            //   boolean containsKey(Object key) 判断key是否存在，若存在返回true，否则返回false
            if (map.containsKey(hot.getTitle())) {
                //  V get(Object key);  通过key值获取value
                map.put(hot.getTitle(), map.get(hot.getTitle()) + 1);
            } else {//key没有，标题不存在的情况下，就设置标题为key，值为1
                map.put(hot.getTitle(), 1);
            }
        }
        //建议不直接用map作为返回值
        List<TitleHotCount> res = new ArrayList<>();
        //把对应的值放到对象里边（count）去
        for (String key : map.keySet()) {//keySet()得到所有的key值
            TitleHotCount title_hot = new TitleHotCount();
            //将key设置到对象的title属性
            title_hot.setTitle(key);
            //将value设置到count里
            title_hot.setCount(map.get(key));
            res.add(title_hot);
        }
          /*  Collections.sort(res, new Comparator<TitleHotCount>() {
                @Override
                public int compare(TitleHotCount o1, TitleHotCount o2) {
                    return o1.getCount()-o2.getCount();
                }
            });*/
        //排序 取前10
        //
        res=res.stream().sorted((h1,h2)->
                -(h1.getCount()-h2.getCount())
        ).limit(10).collect(Collectors.toList());
        return res;
    }

    /**
     * 各个title的热点统计
     * 采用数据的方式，分组计数  select title ,count(*) from title_hot group by count
     * 采用 HashMap<String,Integer>(),key是标题，value是计数
     */
    public List<TitleHotCount> findTitleCountByTimeStamp(long startTime, long endTime) throws IOException {
        //查询出的原始数据
        List<TitleHot> list = hBaseDao.query(startTime, endTime);
        Map<String,Integer> map=new HashMap<>();//标题，次数
        for (TitleHot hot : list) {//标题出现一次  次数就+1
            //map中的key是唯一的，value不唯一
            //判断map中的key(标题)是否存在,若存在就把上一次的值+1;若不存在，则将值设置为1
            //   boolean containsKey(Object key) 判断key是否存在，若存在返回true，否则返回false
            if (map.containsKey(hot.getTitle())) {
                //  V get(Object key);  通过key值获取value
                map.put(hot.getTitle(), map.get(hot.getTitle()) + 1);
            } else {//key没有，标题不存在的情况下，就设置标题为key，值为1
                map.put(hot.getTitle(), 1);
            }
        }
            //建议不直接用map作为返回值
           List<TitleHotCount> res = new ArrayList<>();
            //把对应的值放到对象里边（count）去
            for (String key : map.keySet()) {//keySet()得到所有的key值
                TitleHotCount title_hot = new TitleHotCount();
                //将key设置到对象的title属性
                title_hot.setTitle(key);
                //将value设置到count里
                title_hot.setCount(map.get(key));
                res.add(title_hot);
            }
          /*  Collections.sort(res, new Comparator<TitleHotCount>() {
                @Override
                public int compare(TitleHotCount o1, TitleHotCount o2) {
                    return o1.getCount()-o2.getCount();
                }
            });*/
            //排序 取前10
        //
            res=res.stream().sorted((h1,h2)->
                    -(h1.getCount()-h2.getCount())
            ).limit(10).collect(Collectors.toList());
            return res;
        }
    // todo 按月度统计热度情况
    // todo 按月度统计热度情况、分终端的情况
    // todo 分终端进行统计
}
